# 导入模块
import pandas as pd
import random
# 读取数据
df_project = pd.read_excel(r'.\data\水果卖场产品销量数据.xls')
df_member = pd.read_excel(r'.\data\水果卖场会员数据.xls')
df_sale = pd.read_excel(r'.\data\水果卖场销售数据.xls')
# 转型float 以便jsonify
df_project['销量'] = df_project['销量'].astype('float64')

# TODO 散点图
def task1a(name='华冠超市'):
    # 取出 当前卖场数据
    df_market = df_project[df_project['卖场名称']==name]
    # 按产品名称分组 求和
    pname = df_market.groupby('产品名称').sum()
    data1 = df_market.loc[:,['产品名称','销量']].values.tolist()
    # 如果想要加入总销量，那么pname的值就可以利用，这里没有用，所以可以不用这行value': list(pname['销量']
    # 返回 数据
    return {'index': list(pname.index),
            'value': list(pname['销量']),
            'data':data1}

# TODO （1b） 词云图
def task1b(name='华冠超市'):
    # 按卖场、产品分组统计销量
    task_1b = df_project.pivot_table(index=['卖场名称', '产品名称'], values='销量', aggfunc='sum').reset_index()
    # 按卖场分组，组内降序排序。
    task_1b = task_1b.groupby('卖场名称').apply(lambda x: x.sort_values('销量', ascending=False)).drop(
        '卖场名称', axis=1).reset_index().drop('level_1', axis=1)
    # 词云数据格式： [{}，{}]
    data3 = {}
    for market in task_1b['卖场名称'].unique():
        # 当前卖场的数据
        cur_market = task_1b[task_1b['卖场名称']==market]
        # 字典
        data3.update(
            {market: {'wordCloud': [{'value': s, 'name': n} for n, s in zip(cur_market['产品名称'], cur_market['销量'])]  } }
        )
    # 返回
    return data3[name]

# TODO 关系图
def task2(name='华冠超市'):
    # 取出当前卖场数据
    df_market = df_project[df_project['卖场名称']==name]
    # 取出产品名称 和 分类
    pname = df_market['产品名称'].unique()
    pkind = df_market['产品分类'].unique()
    # 存储 产品名称 和 产品分类 的坐标
    n_list = []
    k_list = []
    # 存储关系
    links = []
    for n,k,x in zip(pname, pkind, range(len(pname))):
        # 添加 产品名称 的坐标
        n_list.append(
            {
                'name': n,
                # 'x': random.randint(2, 10)*1000-random.randint(4, 9)*500,
                # 'y': random.randint(2, 7)*500-random.randint(3, 5)*500,
                'x': x*30,
                'y': 20,
            }
        )
        # 添加 产品分类 的坐标
        k_list.append(
            {
                'name': k,
                # 'x': random.randint(3, 8)*1000-random.randint(4, 10)*500,
                # 'y': random.randint(3, 5)*500-random.randint(2, 5)*500,
                'x': x * 30,
                'y': 110,
            }
        )
    # 列表-元组：[(),..]
    indexs = list(df_market.groupby(['产品名称', '产品分类']).count().index)
    # 循环：映射关系
    for s, t in indexs:
        # 添加关系： 产品名称 所属 产品分类
        links.append(
            {
                'source': s,
                'target': t,
            }
        )
    # 合并 产品名称 和 产品分类
    data10 = n_list + k_list
    # 返回
    return {'data': data10,
            'links': links}

# TODO 箱线图-左
def task3a(name='华冠超市'):
    index = []
    value = []
    # 分组卖场，取出销售预算列
    group = df_sale.groupby('卖场名称')['销售预算']
    # i[0] 卖场名称，list(i[1])销售预算列
    for i in list(group):
        index.append(i[0])
        value.append(list(i[1]))
    return {'index': index,
            'value': value}

# TODO 箱线图-右
def task3b(name='华冠超市'):
    # 取出 当前卖场数据
    df_market = df_sale[df_sale['卖场名称']==name]
    # 返回
    return {'value': [list(df_market['销售预算'])]}

# TODO（4） 监控展示
def task4(name='华冠超市'):
    # 按卖场分组统计各类数值
    task_4 = df_sale.groupby('卖场名称').sum().reset_index()
    # 算出 日商=销售/门店
    task_4['日商'] = round(task_4['销售'] / task_4['门店数'], 6)*10000
    # 选取
    task_4 = task_4.loc[:, ['卖场名称', '销售', 'TC', 'AC', '日商']]
    # 展示的数据格式：{}
    data4 = {}
    for market in task_4['卖场名称'].unique():
        # 当前卖场的数据
        cur_market = task_4[task_4['卖场名称']==market]
        # 字典
        data4.update(
            {
                market: {
                    '销售': list(cur_market['销售'])[0],
                    'TC': list(cur_market['TC'])[0],
                    'AC': list(cur_market['AC'])[0],
                    '日商': list(cur_market['日商'])[0],
                }
            }
        )
    # 返回
    return data4[name]

# TODO（2） 地图
def task5(name='华冠超市'):
    # 各省份销售额
    sale_sum = df_project.pivot_table(index=['卖场名称', '省份名称'], values='销量', aggfunc='sum').reset_index().\
        rename(columns={'省份名称': '省份', '销量': '销售额'})
    # 门店数在销售表
    store_sum = df_sale.pivot_table(index='省份', values='门店数', aggfunc='sum').reset_index()
    # 拼接省份销售额和门店数
    task_5 = pd.merge(left=sale_sum, right=store_sum, on='省份')
    # 算出日商
    task_5['日商'] = round(task_5['销售额'] / task_5['门店数'], 2)
    task_5['销售额2'] = round(task_5['销售额']/10000)
    # 循环每个卖场的数据，形成字典
    data2 = {}
    for market in task_5['卖场名称'].unique():
        # 当前卖场的数据
        cur_market = task_5[task_5['卖场名称']==market]
        data2.update(
            {market: {'销量': [{'value': s, 'name': p} for p, s in zip(list(cur_market['省份']), list(cur_market['销售额2']))]  } }
        )
        # 省份和日商：成字典形式
        data2[market]['门店平均销量'] = [{'value': s, 'name': p} for p, s in zip(list(cur_market['省份']), list(cur_market['日商']))]
        # 最大值
        data2[market]['max_销量'] = round(max(cur_market['销售额'])/10000)
        data2[market]['max_门店平均销量'] = max(cur_market['日商'])
        # 添加3个数据中没有的省份: extend()添加多个值
        data2[market]['销量'].extend(
            [{'value': 0, 'name': '上海'}, {'value': 0, 'name': '海南'}, {'value': 0, 'name': '南海诸岛'}]
        )
        data2[market]['门店平均销量'].extend(
            [{'value': 0, 'name': '上海'}, {'value': 0, 'name': '海南'}, {'value': 0, 'name': '南海诸岛'}]
        )
    # 返回
    return data2[name]

# TODO （6a） 气泡图
def task6a(name='华冠超市'):
    # 按卖场、产品分类分组求和
    task_6a = df_project.groupby(['卖场名称', '省份名称', '产品分类'], as_index=False).sum().drop('月份', axis=1)
    # 按卖场分组组内降序排序
    task_6a = task_6a.groupby(['卖场名称', '省份名称'], as_index=False).apply(lambda x: x.sort_values('销量', ascending=False)
                                                          ).reset_index().drop(['level_0', 'level_1'], axis=1)
    # 按卖场分组组内取前10
    task_6a = task_6a.groupby(['卖场名称', '省份名称']).head(10)
    # 销量以万元为单位
    task_6a['销量'] = round(task_6a['销量']/10000)
    # 展示的数据格式：{}
    data5 = {}
    for market in task_6a['卖场名称'].unique():
        # 当前卖场的数据
        cur_market = task_6a[task_6a['卖场名称'] == market]
        data1 = cur_market.loc[:, ['产品分类', '销量']].values.tolist()
        catda = task_6a['产品分类'].unique().tolist()
        # 字典
        data5.update(
            {
                market: {
                    '产品分类': catda,
                    '销量': list(cur_market['销量']),
                    'data': data1,

                }
            }
        )
    return data5[name]

# TODO（6b） 条形图
def task6b(name='华冠超市'):
    # 按卖场、产品分类分组求和
    task_6b = df_project.groupby(['卖场名称', '产品分类']).sum().reset_index().loc[:, ['卖场名称', '产品分类', '销量']]
    # 按卖场分组组内降序排序
    task_6b = task_6b.groupby('卖场名称').apply(lambda x: x.sort_values('销量', ascending=False)).drop(
        '卖场名称', axis=1).reset_index().drop('level_1', axis=1)
    # 按卖场分组组内取前10
    task_6b = task_6b.groupby('卖场名称').head(10)
    # 销量以万元为单位
    task_6b['销量'] = round(task_6b['销量']/10000)
    # 展示的数据格式：{}
    data6 = {}
    for market in task_6b['卖场名称'].unique():
        # 当前卖场的数据
        cur_market = task_6b[task_6b['卖场名称']==market]
        # 字典
        data6.update(
            {
                market: {
                    '产品分类': list(cur_market['产品分类']),
                    '销量': list(cur_market['销量']),
                }
            }
        )
    return data6[name]

# TODO 仪表图
def task7(name='华冠超市'):
    # 按卖场分组，求和
    market_sale = df_project.groupby('卖场名称').sum()
    total = df_project['销量'].sum()
    # 存储仪表盘数据
    data7 = {}
    # 循环各卖场
    for market in list(market_sale.index):
        # 添加各卖场的数据
        data7.update(
            {
                market: {
                    'name': market,
                    'value': market_sale.loc[market, '销量'],
                    'total': total
                }
            }
        )
    return  data7[name]

# TODO 折线图
def task8(name='华冠超市'):
    # 取出 当前卖场数据
    df_market = df_member[df_member['卖场名称']==name]
    # 按月份分组：求和会员增加数
    member = df_market.pivot_table(index='month', values='会员增加数', aggfunc='sum')
    return {'index': list(member.index),
            'value': list(member['会员增加数'])}

# TODO 返回全部卖场的名称
def markets():
    market = df_project['卖场名称'].unique()
    market.sort()
    market = list(market)
    return market